using UnityEngine;
using TMPro;
using UI.BankingPanel.Data;

namespace UI.BankingPanel.Components
{
    /// <summary>
    /// 风险数据项组件
    /// 用于显示单个号码的风险相关信息，包括号码、吃码数量和风险值
    /// 
    /// 主要功能：
    /// 1. 显示号码（01-49）
    /// 2. 显示吃码数量
    /// 3. 显示风险值（负数表示亏损）
    /// 4. 支持颜色状态显示（高风险红色警告）
    /// </summary>
    public class C_RiskData_Item : MonoBehaviour
    {
        [Header("UI组件引用")]
        [SerializeField] private TextMeshProUGUI m_NumberText;        // 号码显示文本
        [SerializeField] private TextMeshProUGUI m_EatCodeCountText;  // 吃码数量显示文本
        [SerializeField] private TextMeshProUGUI m_RiskValueText;     // 风险值显示文本
        
        [Header("背景组件")]
        [SerializeField] private GameObject m_NumberBackground;       // 号码背景
        [SerializeField] private GameObject m_EatCodeBackground;      // 吃码数量背景
        [SerializeField] private GameObject m_RiskValueBackground;    // 风险值背景
        
        [Header("颜色配置")]
        [SerializeField] private Color m_NormalColor = Color.white;   // 正常颜色（零值）
        [SerializeField] private Color m_ProfitColor = Color.green;   // 盈利颜色（正值）
        [SerializeField] private Color m_LossColor = Color.red;       // 亏损颜色（负值）
        [SerializeField] private float m_HighRiskThreshold = -5000f;  // 高风险阈值（保留兼容性）
        
        // 数据相关
        private NumberBetData m_BetData;
        private bool m_IsInitialized = false;
        
        #region 初始化方法
        
        /// <summary>
        /// 初始化组件
        /// </summary>
        public void Initialize()
        {
            if (m_IsInitialized)
            {
                Debug.Log("[C_RiskData_Item] 已经初始化过了，跳过");
                return;
            }
            
            Debug.Log("[C_RiskData_Item] 开始初始化...");
            
            // 查找UI组件
            FindUIComponents();
            
            m_IsInitialized = true;
            Debug.Log("[C_RiskData_Item] 初始化完成");
        }
        
        /// <summary>
        /// 查找UI组件
        /// </summary>
        private void FindUIComponents()
        {
            // 查找号码显示文本
            if (m_NumberText == null)
            {
                Transform numberBg = transform.Find("Number_Background");
                if (numberBg != null)
                {
                    m_NumberBackground = numberBg.gameObject;
                    m_NumberText = numberBg.Find("Text")?.GetComponent<TextMeshProUGUI>();
                }
                
                if (m_NumberText == null)
                {
                    Debug.LogWarning("[C_RiskData_Item] 未找到号码显示文本组件");
                }
            }
            
            // 查找吃码数量显示文本
            if (m_EatCodeCountText == null)
            {
                Transform eatCodeBg = transform.Find("Eat_Code_Count_Background");
                if (eatCodeBg != null)
                {
                    m_EatCodeBackground = eatCodeBg.gameObject;
                    m_EatCodeCountText = eatCodeBg.Find("Text")?.GetComponent<TextMeshProUGUI>();
                }
                
                if (m_EatCodeCountText == null)
                {
                    Debug.LogWarning("[C_RiskData_Item] 未找到吃码数量显示文本组件");
                }
            }
            
            // 查找风险值显示文本
            if (m_RiskValueText == null)
            {
                Transform riskValueBg = transform.Find("Risk_Value_Background");
                if (riskValueBg != null)
                {
                    m_RiskValueBackground = riskValueBg.gameObject;
                    m_RiskValueText = riskValueBg.Find("Text")?.GetComponent<TextMeshProUGUI>();
                }
                
                if (m_RiskValueText == null)
                {
                    Debug.LogWarning("[C_RiskData_Item] 未找到风险值显示文本组件");
                }
            }
            
            Debug.Log($"[C_RiskData_Item] 组件查找完成 - 号码文本: {m_NumberText != null}, 吃码文本: {m_EatCodeCountText != null}, 风险值文本: {m_RiskValueText != null}");
        }
        
        #endregion
        
        #region 数据更新方法
        
        /// <summary>
        /// 更新风险数据显示
        /// </summary>
        /// <param name="betData">押注数据</param>
        public void UpdateRiskData(NumberBetData betData)
        {
            if (!m_IsInitialized)
            {
                Initialize();
            }
            
            m_BetData = betData;
            
            if (betData == null)
            {
                ClearDisplay();
                return;
            }
            
            Debug.Log($"[C_RiskData_Item] 更新风险数据 - 号码: {betData.number}, 吃码: {betData.selfBetAmount}, 风险值: {betData.riskValue}");
            
            // 更新号码显示
            UpdateNumberDisplay(betData.number);
            
            // 更新吃码数量显示
            UpdateEatCodeCountDisplay(betData.selfBetAmount);
            
            // 更新风险值显示
            UpdateRiskValueDisplay(betData.riskValue);
            
            // 更新颜色状态
            UpdateColorStatus(betData.riskValue);
        }
        
        /// <summary>
        /// 更新号码显示
        /// </summary>
        /// <param name="number">号码</param>
        private void UpdateNumberDisplay(int number)
        {
            if (m_NumberText != null)
            {
                m_NumberText.text = number.ToString("D2"); // 格式化为两位数
            }
        }
        
        /// <summary>
        /// 更新吃码数量显示
        /// </summary>
        /// <param name="eatCodeCount">吃码数量</param>
        private void UpdateEatCodeCountDisplay(float eatCodeCount)
        {
            if (m_EatCodeCountText != null)
            {
                // 吃码数量显示为整数
                m_EatCodeCountText.text = Mathf.FloorToInt(eatCodeCount).ToString();
            }
        }
        
        /// <summary>
        /// 更新风险值显示
        /// </summary>
        /// <param name="riskValue">风险值</param>
        private void UpdateRiskValueDisplay(float riskValue)
        {
            if (m_RiskValueText != null)
            {
                // 使用统一的数字格式，0值显示为"0"
                if (riskValue == 0)
                {
                    m_RiskValueText.text = "0";
                }
                else
                {
                    m_RiskValueText.text = riskValue.ToString("0.##");
                }
            }
        }
        
        /// <summary>
        /// 更新颜色状态
        /// </summary>
        /// <param name="riskValue">风险值</param>
        private void UpdateColorStatus(float riskValue)
        {
            Color targetColor;
            
            // 根据风险值的正负性确定颜色
            if (riskValue > 0)
            {
                // 正值：盈利，显示绿色
                targetColor = m_ProfitColor;
            }
            else if (riskValue < 0)
            {
                // 负值：亏损，显示红色
                targetColor = m_LossColor;
            }
            else
            {
                // 零值：平衡，显示正常颜色
                targetColor = m_NormalColor;
            }
            
            // 更新风险值文本颜色
            if (m_RiskValueText != null)
            {
                m_RiskValueText.color = targetColor;
            }
            
            // 可以根据需要更新背景颜色或其他视觉效果
            // 例如：高风险时背景变红等
        }
        
        /// <summary>
        /// 清空显示
        /// </summary>
        private void ClearDisplay()
        {
            if (m_NumberText != null)
                m_NumberText.text = "--";
            
            if (m_EatCodeCountText != null)
                m_EatCodeCountText.text = "0";
            
            if (m_RiskValueText != null)
            {
                m_RiskValueText.text = "0";
                m_RiskValueText.color = m_NormalColor;
            }
        }
        
        #endregion
        
        #region 公共接口方法
        
        /// <summary>
        /// 获取当前显示的押注数据
        /// </summary>
        /// <returns>押注数据</returns>
        public NumberBetData GetBetData()
        {
            return m_BetData;
        }
        
        /// <summary>
        /// 设置高风险阈值
        /// </summary>
        /// <param name="threshold">阈值</param>
        public void SetHighRiskThreshold(float threshold)
        {
            m_HighRiskThreshold = threshold;
            
            // 如果有数据，重新更新颜色状态
            if (m_BetData != null)
            {
                UpdateColorStatus(m_BetData.riskValue);
            }
        }
        
        /// <summary>
        /// 设置亏损颜色
        /// </summary>
        /// <param name="color">颜色</param>
        public void SetLossColor(Color color)
        {
            m_LossColor = color;
            
            // 如果当前是亏损状态，立即更新颜色
            if (m_BetData != null && m_BetData.riskValue < 0)
            {
                UpdateColorStatus(m_BetData.riskValue);
            }
        }

        /// <summary>
        /// 设置盈利颜色
        /// </summary>
        /// <param name="color">颜色</param>
        public void SetProfitColor(Color color)
        {
            m_ProfitColor = color;
            
            // 如果当前是盈利状态，立即更新颜色
            if (m_BetData != null && m_BetData.riskValue > 0)
            {
                UpdateColorStatus(m_BetData.riskValue);
            }
        }

        /// <summary>
        /// 设置高风险颜色（保留兼容性）
        /// </summary>
        /// <param name="color">颜色</param>
        [System.Obsolete("请使用SetLossColor方法")]
        public void SetHighRiskColor(Color color)
        {
            SetLossColor(color);
        }
        
        /// <summary>
        /// 检查是否为亏损状态
        /// </summary>
        /// <returns>是否为亏损</returns>
        public bool IsLoss()
        {
            return m_BetData != null && m_BetData.riskValue < 0;
        }

        /// <summary>
        /// 检查是否为盈利状态
        /// </summary>
        /// <returns>是否为盈利</returns>
        public bool IsProfit()
        {
            return m_BetData != null && m_BetData.riskValue > 0;
        }

        /// <summary>
        /// 检查是否为高风险（保留兼容性）
        /// </summary>
        /// <returns>是否为高风险</returns>
        [System.Obsolete("请使用IsLoss方法")]
        public bool IsHighRisk()
        {
            return IsLoss();
        }
        
        /// <summary>
        /// 设置项目可见性
        /// </summary>
        /// <param name="visible">是否可见</param>
        public void SetVisible(bool visible)
        {
            gameObject.SetActive(visible);
        }
        
        /// <summary>
        /// 调试信息 - 检查组件状态
        /// </summary>
        public void DebugComponentStatus()
        {
            Debug.Log($"=== C_RiskData_Item 组件状态 ===");
            Debug.Log($"是否已初始化: {m_IsInitialized}");
            Debug.Log($"号码文本: {(m_NumberText != null ? "已找到" : "未找到")}");
            Debug.Log($"吃码文本: {(m_EatCodeCountText != null ? "已找到" : "未找到")}");
            Debug.Log($"风险值文本: {(m_RiskValueText != null ? "已找到" : "未找到")}");
            Debug.Log($"当前数据: {(m_BetData != null ? $"号码{m_BetData.number}" : "无数据")}");
            Debug.Log($"高风险阈值: {m_HighRiskThreshold}");
        }
        
        #endregion
        
        #region Unity生命周期
        
        private void Awake()
        {
            // 在Awake中进行基础初始化
            FindUIComponents();
        }
        
        private void Start()
        {
            // 确保初始化完成
            if (!m_IsInitialized)
            {
                Initialize();
            }
        }
        
        #endregion
    }
} 